package com.crcchem.practice.demos.web.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpSession;

/**
 * 1. Session 是什么？
 * Session 是服务器端保存用户状态的一种方式。每个访问用户会自动分配一个唯一的 Session ID，通常由服务器通过 Cookie 保存在浏览器中（比如 JSESSIONID），之后每次请求都会自动带上这个 ID。
 * <p>
 * 2. HttpSession 作用
 * 在 Spring Boot 中你可以通过形参 HttpSession 自动获取当前请求对应的会话对象，常用方法如下：
 * setAttribute(key, value)：写入会话
 * getAttribute(key)：读取会话
 * invalidate()：销毁会话（清空所有属性）
 * <p>
 * 3. 生命周期
 * 默认 Session 30 分钟后过期（可配置）
 * 用户退出登录后也可以主动销毁 Session（如调用 invalidate()）
 * <p>
 * Session 与 Cookie 的配合
 * 虽然 Session 是服务端技术，但浏览器需要通过 Cookie 自动带上 JSESSIONID 才能识别用户身份。流程如下：
 * 首次访问登录 → 服务器创建 Session → 返回 Set-Cookie:JSESSIONID=xxx → 浏览器保存
 * ↓
 * 后续请求 → 浏览器自动带上 Cookie:JSESSIONID=xxx → 服务器根据 ID 查找 Session
 */
@RestController
@RequestMapping("/Session")
public class SessionController {

    /**
     * 模拟登录：把用户名存入 Session 中
     */
    @GetMapping("login")
    public String login(HttpSession session) {
        session.setAttribute("username", "admin");
        session.setAttribute("password", "admin");
        return "login";
    }

    /**
     * 获取 Session 中的值
     */
    @GetMapping("/getSession")
    public String getSession(HttpSession session) {
        String username = (String) session.getAttribute("username");
        String password = (String) session.getAttribute("password");
        if (username.equals("admin") && password.equals("admin")) {
            return "login getSession";
        } else {
            return "error getSession";
        }
    }

    /**
     * 注销登录：移除 Session 中的值
     */
    @GetMapping("/logout")
    public String logout(HttpSession session) {
        session.invalidate();
        return "logout";
    }

}
